package com.mail.server.service;

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.mail.dubbo.api.UmsMenuApi;
import com.mail.model.db.UmsMenu;
import com.mail.model.vo.MyPage;
import com.mail.model.vo.UmsMenuVo;
import com.mail.server.common.R;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * @author 吕永乐
 * @date 2022/06/23 10:30
 **/
@Service
public class UmsMenuService {

	@DubboReference
	private UmsMenuApi umsMenuApi;

	/**
	 * 树形结构返回所有菜单列表
	 * @return
	 */
	public List<UmsMenuVo> treeList() {
		// 1. 查询所有菜单列表
		List<UmsMenu> allMenu = umsMenuApi.getAll();
		// 2. 定义根节点菜单集合
		List<UmsMenuVo> rootMenus = new ArrayList<>();
		for (UmsMenu umsMenu : allMenu) {
			// 2.1 判断 parentId 是否为 0, 0 则是跟节点
			if(umsMenu.getParentId() == 0){
				UmsMenuVo umsMenuVo = new UmsMenuVo();
				BeanUtils.copyProperties(umsMenu, umsMenuVo);
				rootMenus.add(umsMenuVo);
			}
		}
		// 3. 遍历跟节点,为其添加子节点 children
		for (UmsMenuVo menu : rootMenus) {
			List<UmsMenuVo> children = getChild(menu.getId(), allMenu);
			menu.setChildren(children);
		}
		return rootMenus;
	}

	/**
	 * 获取子节点
	 * @param id 菜单id
	 * @param allMenu 所有菜单集合
	 * @return
	 */
	private List<UmsMenuVo> getChild(Long id, List<UmsMenu> allMenu) {
		// 定义子节点集合
		List<UmsMenuVo> childList = new ArrayList<>();
		for (UmsMenu menu : allMenu) {
			// 如果 传来的 id 和 parentId 一样,则添加进 childList 中
			if (id.equals(menu.getParentId())) {
				UmsMenuVo menuDto = new UmsMenuVo();
				BeanUtils.copyProperties(menu, menuDto);
				childList.add(menuDto);
			}
		}

		// 如果 childList 大小为0,说明没有子节点,则返回,结束递归
		if (childList.size() == 0) {
			return childList;
		}

		// 不为0,递归
		for (UmsMenuVo umsMenuVo : childList) {
			umsMenuVo.setChildren(getChild(umsMenuVo.getId(), allMenu));
		}
		return childList;
	}

	/**
	 * 分页查询后台菜单(分页查询)
	 * @param pageNum
	 * @param pageSize
	 * @param parentId
	 * @return
	 */
	public MyPage<UmsMenu> listByPage(Long pageNum, Long pageSize, Long parentId) {
		Page<UmsMenu> page = umsMenuApi.getListByPage(pageNum, pageSize, parentId);
		return MyPage.init(page);
	}

	/**
	 * 根据ID获取菜单详情
	 * @param id
	 * @return
	 */
	public UmsMenu getById(Long id) {
		UmsMenu umsMenu = umsMenuApi.getById(id);
		return umsMenu;
	}

	/**
	 * 修改后台菜单
	 * @param umsMenu
	 * @return
	 */
	public R<Integer> update(UmsMenu umsMenu) {
		if(umsMenu.getParentId() == 0){
			umsMenu.setLevel(0);
		}else {
			umsMenu.setLevel(1);
		}
		Integer count = umsMenuApi.update(umsMenu);
		return R.success(count, "操作成功!");
	}

	/**
	 * 修改菜单显示状态
	 * @param id
	 * @param hidden
	 * @return
	 */
	public R<Integer> updateHidden(Long id, Integer hidden) {
		Integer count = umsMenuApi.updateHiddenById(id, hidden);
		return R.success(count, "操作成功!");
	}

	/**
	 * 根据ID删除后台菜单
	 * @param id
	 * @return
	 */
	public R<Integer> delete(Long id) {
		Integer count = umsMenuApi.delete(id);
		return R.success(count, "操作成功!");
	}

	/**
	 * 添加后台菜单
	 * @param umsMenu
	 * @return
	 */
	public R<Integer> create(UmsMenu umsMenu) {
		umsMenu.setCreateTime(DateUtil.toLocalDateTime(new Date()));
		if(umsMenu.getParentId() == 0){
			umsMenu.setLevel(0);
		}else {
			umsMenu.setLevel(1);
		}
		Integer count = umsMenuApi.create(umsMenu);
		return R.success(count, "操作成功!");
	}
}
